Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Exceptions
8 Die Funktionsbibliothek
9 Threads und nebenläufige Programmierung
10 Raum und Zeit
11 Datenstrukturen und Algorithmen
12 Dateien und Datenströme
13 Die eXtensible Markup Language (XML)
14 Grafische Oberflächen mit Swing
15 Grafikprogrammierung
16 Das Netz
17 JavaServer Pages und Servlets
18 Verteilte Programmierung mit RMI und Web–Services
19 Applets, Midlets und Sound
20 Datenbankmanagement mit JDBC
21 Reflection und Annotationen
22 Komponenten durch Bohnen
23 Logging und Monitoring
24 Sicherheitskonzepte
25 Java Native Interface (JNI)
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Index

Download:
- ZIP, ca. 12,5 MB
Buch bestellen

Website zum Buch
Weblog des Autors
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
6., akt. und erw. Aufl., mit DVD
1.454 S., 49,90 Euro
Galileo Computing
ISBN 3-89842-838-9
gp 26 Dienstprogramme für die Java-Umgebung
  gp 26.1 Die Werkzeuge im Überblick
  gp 26.2 Java-Compiler
    gp 26.2.1 Bytecode Compiler javac
    gp 26.2.2 Native Compiler
    gp 26.2.3 Java-Programme in ein natives ausführbares Programm einpacken
  gp 26.3 Der Java-Interpreter java
    gp 26.3.1 Der Unterschied zwischen java.exe und javaw.exe
  gp 26.4 Das Archivformat Jar
    gp 26.4.1 Das Dienstprogramm Jar benutzen
    gp 26.4.2 Das Manifest
    gp 26.4.3 Applikationen in Jar-Archiven starten
    gp 26.4.4 Applets in Jar-Archiven
  gp 26.5 Monitoringprogramme
    gp 26.5.1 jps
    gp 26.5.2 jstat
    gp 26.5.3 jmap
    gp 26.5.4 jstack
  gp 26.6 Ant
    gp 26.6.1 Bezug und Installation von Ant
    gp 26.6.2 Properties
    gp 26.6.3 Externe und vordefinierte Properties
    gp 26.6.4 Weitere Ant-Tasks
  gp 26.7 Decompiler und Obfuscatoren
    gp 26.7.1 Der Decompiler Jad
    gp 26.7.2 Das Decompilieren erschweren
    gp 26.7.3 Das Obfuscator-Programm ProGuard
  gp 26.8 Sourcecode Beautifier
  gp 26.9 Zum Weiterlesen


Galileo Computing

26.6 Ant  downtop

Die Arbeiten eines Softwareentwicklers sind nicht immer so spannend, wie es die Fantasie vorgaukelt. Der Alltag besteht aus Compilieren, dem Erstellen von Dokumentationen, dem Aktualisieren von Webseiten, dem Ausliefern von Archiven und Ähnlichem. Der schlaue Zeitgenosse schreibt sich für diese Aufgabe Skripte. Unter Unix wurde für die Sammlung dieser Skripte ein so genanntes make-Tool benutzt. Besondere Aufgabe von make war es, Zusammenhänge zwischen verschiedenen Quellcodedateien zu erkennen und dann die benötigten neu zu übersetzen. Wenn sich zum Beispiel eine Header-Datei ändert, muss auch die C–Datei, die diese Header-Datei einbindet, neu übersetzt werden.

Unter Java können wir mit diesem make-Tool nicht so viel anfangen, doch Aufgaben wie das Erstellen von Archiven, die Neuübersetzung aller Quellen und das Erzeugen von Dokumentation bleiben. Für diese Aufgaben wurde von der Apache-Gruppe ein Tool mit dem Namen Ant (http://ant.apache.org/) entwickelt. Der Name selbst ist ein Akronym aus Another Neat Tool. Ein weiteres populäres Produkt der Apache-Group ist maven (http://maven.apache.org/). Es geht noch Schritt weiter und bietet standardisiertes Erstellen von Anwendungen zusammen mit Dokumentation, Tests, .


Galileo Computing

26.6.1 Bezug und Installation von Ant  downtop

Wir erhalten ein Archiv von Ant auf den Seiten der Indianer-Gruppe, genauer gesagt unter http://ant.apache.org/bindownload.cgi. Nach dem Entpacken sollten wir unsere Umgebungsvariable (PATH) so erweitern, dass sie auf das bin/-Verzeichnis von Ant zeigt.

Wenn wir jetzt ant auf der Kommandozeile aufrufen, dann sollte folgende Ausgabe zu sehen sein:

$ ant 
Buildfile: build.xml does not exist! 
Build failed

Die Installation liefert alle benötigten Bibliotheken mit.

Wir begnügen uns am Anfang mit einer einfachen Java-Klasse, die Ant verwalten soll.

Listing 26.2    AntDemo.java

package ant; 
 
public class AntDemo 
{ 
  public static void main( String[] args ) 
  { 
    System.out.println( "Ant is beautiful." ); 
  } 
}

Dieses Mal wollte ich die Quellcodedatei jedoch nicht von Hand übersetzen lassen, weil dies unser Hilfsprogramm erledigt.

Das Build-Skript build.xml

Eine XML-Datei beschreibt, welche Schritte Ant auszuführen hat. Ant nennt die Dateien Build-Files, und eine solche Datei heißt oft build.xml. Wir wollen sie in das gleiche Verzeichnis stellen, in dem auch unsere Java-Quellcodedatei steht.

Listing 26.3    build.xml

<?xml version="1.0"?> 
<project name="Insel" default="build" basedir="."> 
  <target name="build"> 
    <javac srcdir="." /> 
  </target> 
</project>

Eine DTD-Referenzierung ist für die XML-Datei ist nicht zwingend nötig, da der Parser die Datei nicht validierend abarbeitet. Der Eintrag <project> definiert das Projekt unter dem Namen Insel. Das Attribut default definiert weiterhin, dass der einfache Aufruf von Ant automatisch das Ziel build aufrufen soll.

Im inneren vom Eintrag <project> folgen <target>-Einträge. Wir definieren das Ziel build, was den Compiler starten soll. Das übernimmt der Task <javac>, der alle Dateien, die sich im aktuellen Verzeichnis befinden, compiliert. Neben <javac> stellt Ant eine große Zahl zusätzlicher Tasks bereit.

Wechseln wir auf der Kommandozeile in das Verzeichnis mit den Dateien, dann reicht es, Ant aufzurufen, und der Konstruktionsprozess beginnt. Ant sucht selbstständig nach der Datei build.xml. Folgendes erscheint:

$ ant 
Buildfile: build.xml 
build: 
    [javac] Compiling 1 source file 
BUILD SUCCESSFUL

Die Option -verbose gibt zusätzliche Informationen über den Entstehungsprozess aus. Die Datei build.xml lässt sich vielfältig anpassen. Nehmen wir uns den Eintrag <javac> noch einmal vor und erweitern wir ihn zu:

<javac srcdir="." debug="true" optimize="false" includes="**/*.java" />

Das weist Ant an, während der Übersetzung zu optimieren und Debug-Informationen mit aufzunehmen. Das Attribut includes befiehlt, nicht nur Quellcodedateien des aktuellen Verzeichnisses zu übersetzen, sondern auch alle Dateien aller Unterverzeichnisse. Die Notation »**/« ist eine Vereinfachung, die für alle Unterverzeichnisse steht. An ihrer Stelle ist auch eine Aufzählung der Verzeichnisse zulässig.


Galileo Computing

26.6.2 Properties  downtop

Eine gute Idee ist es, sich von den konkreten Pfaden im <javac>-Element zu lösen, denn Ant erlaubt es, Eigenschaften zu definieren, die Platzhaltern oder Makros ähneln.. Um Programme aus einem Verzeichnis (nennen wir es src) in ein Zielverzeichnis (nennen wir es build) zu übersetzen, schreiben wir:

<property name="src" value="." /> 
<property name="build" value="build" /> 
<target name="compile" depends="init"> 
  <javac srcdir="${src}" destdir="${build}" /> 
</target>

Bisher haben wir uns mit der Übersetzung beschäftigt. Dennoch wissen wir, dass wir auch noch andere target-Elemente verwenden können. Und obwohl die Benennung dieser Targets prinzipiell willkürlich ist, gibt es eine vorgeschlagene Namenskonvention.


Eintrag Bedeutung
init Erstellt Verzeichnisse und Initialisierungsdateien.
build Inkrementeller Aufbau
test Ablaufen der Tests mit JUnit
clean Ausgabeverzeichnisse löschen
deploy Jar, War und sonstige Archive erstellen
publish Veröffentlichen der Ergebnisse
fetch Bezieht die letzten Quellcodedateien vom Cvs-Server.
docs, javadocs Erstellt die Dokumentation.
all Abfolge von clean, fetch, build, test, docs, deploy
main Erstellt das Projekt, in der Regel build oder build, test.

Der Eintrag init soll eine initiale Verzeichnisstruktur aufbauen. Nehmen wir an, der Compiler soll in unser oben genanntes Verzeichnis build übersetzen. Dann muss dieses Verzeichnis natürlich existieren. Das Anlegen des Verzeichnisses kann in init geschehen:

<target name="init"> 
  <mkdir dir="${build}" /> 
</target>

Zum Löschen der erstellten Verzeichnisse in einem Target clean wollen wir ein Property dist für das Distributionsverzeichnis hinzunehmen:

<target name="clean"> 
  <delete dir="${build}" /> 
  <delete dir="${dist}" /> 
</target>

Galileo Computing

26.6.3 Externe und vordefinierte Properties  downtop

Falls sich das Versionsrad eine Nummer weiter dreht, ist es ungünstig, wenn Änderungen an der XML-Datei vorzunehmen sind. Eine gute Lösung für das Problem besteht darin, eine externe Datei anzugeben, die die Version definiert. Das kann so aussehen:

Listing 26.4    version.properties

version=0.6

Jetzt fehlt nur noch der Bezug zu dieser Eigenschaften-Datei in der XML-Datei. Bisher kennen wir zwar einen Eintrag property name und value, aber eine zweite Variante mit dem Attribut file bindet eine Datei ein, die Schlüssel/Werte-Paare wie bei unserer version.properties beschreibt.

<property file="version.properties" />

Jetzt lässt sich auf die Variable version ganz normal zugreifen, um zum Beispiel eine zweite Eigenschaft einzuführen:

<property name="distname" value="Mein-${version}" />

version ist unsere Variable, und ${version} setzt den Inhalt der Variablen ein. Daneben gibt es aber noch einige Standard-Properties:


Property Bedeutung
basedir Absoluter Pfad zum Basisverzeichnis des Projekts. In basedir gesetzt.
ant.file Absoluter Pfad der Build-Datei
ant.version Version von Ant
ant.project.name Name des Projekts, wie in <project> gesetzt
ant.java.version JVM-Version, wie von Ant entdeckt, etwa »1.4«


Beispiel Für ein zügiges Übersetzen lässt sich der Compiler Jikes von IBM einsetzen – er ist in C++ implementiert. Um ihn als Standard-Compiler einzusetzen, muss das Property build.compiler den Wert jikes tragen:
<property name="build.compiler" value="jikes" />


Galileo Computing

26.6.4 Weitere Ant-Tasks  toptop

Ant kann Programme mit automatischen Tests mit JUnit überprüfen, Klassendateien zu einem Archiv zusammenbinden oder E-Mails verschicken. Die Archive lassen sich automatisch auf einen Ftp-Server übertragen. Für Ant gibt es viele Tasks, und http://ant.apache.org/manual/tasksoverview.html gibt einen Überblick. Die wichtigsten Tasks sind:


Tabelle 26.3    Ausgewählte Ant-Tasks
Ant-Task Aufgabe
javac Übersetzten mit Java-Compiler
jar Bündelt Dokumete in ein Java-Archiv
manifest Erzeugt eine Manifest-Datei
signjar Signiert ein Java-Archiv
unjar Packt Java-Archive aus
javadoc Erzeugt die Java-Dokumentation
exec Startet ein externes Programm
copy Kopiert Dateien
mkdir Legt ein Verzeichnis an
move Verschiebt Dateien
echo Schreibt Ausgaben auf die Konsole
sql Sendet SQL-Anweisungen zur Datenbank
javah Erzeugt C-Header Dateien für JNI
junit Arbeitet JUnit-Tests ab


Beispiel Der Ant-Task GenJar (http://genjar.sourceforge.net/) ist eine Erweiterung zum Ant-Jar, da es nicht einfach alle Dateien von Verzeichnissen zu einem Jar kombiniert, sondern durch Bytecodeanalyse herausfindet, welche Abhängigkeiten es wirklich gibt, und nur die Klassendateien mit in das Archiv aufnimmt, die vom Projekt referenziert werden.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.





 <<   zurück



Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de